package com.foton.limiter.construstlimiter.design;

import com.google.common.base.Stopwatch;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StopWatch;

import java.util.concurrent.TimeUnit;

/**
 * @Author RenPu
 * @Date 2023/8/28 15:13
 * @Version 1.0
 * @Description: 使用模版方法设计模式，实现日志，异常的同意记录
 **/


@Slf4j
public abstract class ServiceTemplate<T,R> {


    /**
     * 模版暴露，统一执行入口
     * @param request
     * @return
     */
    public R process(T request){

        //记录日志
        log.info("==========入参为：==========="+request);
        //记录执行开始时间
        Stopwatch stopwatch = Stopwatch.createStarted();

        try{

            //参数校验
            validParam(request);
            //执行子类的具体逻辑
            R response = doProcess(request);

            //记录执行结束时间并打印出所需耗时
            log.info("=======cost time："+stopwatch.elapsed(TimeUnit.MILLISECONDS)+"end invoke response=:"+response);
            return response;

        }catch (Exception e){
           log.info("error:"+e.getMessage()+"error in class:"+e.getClass());
           return null;
        }

    }


    /**
     * 参数校验（交由子类进行实现）
     * @param request
     */
    protected abstract void validParam(T request);


    /**
     *  具体的业务执行逻辑（交由子类进行实现）
     * @param request
     * @return
     */
    protected abstract R doProcess(T request);




}
